#ifndef __GD32E23x_USER_APP_H__
#define __GD32E23x_USER_APP_H__

#include "app_fault.h"
#include "user_floor_ctrl.h"
#include <stdint.h>
#include <stdint.h>
#include <fsm.h>

typedef enum {
	FLOOR_FSM_INIT = 0,			//初始化
	FLOOR_FSM_IDLE,				//空闲状态
	FLOOR_FSM_RUN_TASK,			//执行任务
	FLOOR_FSM_TEST_MODE,		//测试模式
	FLOOR_FSM_FAULT,			//异常模式
	FLOOR_FSM_STOP,				//停止状态
}FLOOR_FSM_STATE_E;

typedef enum {
	FLOOR_EVENT_POWRUP = 0,			//开机启动
	FLOOR_EVENT_TRANSF_OK,			//切换事件成功
	
	FLOOR_EVENT_FAULT,				//异常
	FLOOR_EVENT_NO_FAULT,			//无异常
	FLOOR_EVENT_REACH,				//目标层到达事件
	
	FLOOR_EVENT_PC_PUSH,			//平层到达事件
	FLOOR_EVENT_PC_OFF,				//平层离开事件

	FLOOR_EVENT_DOOR_OPEN,			//门锁打开
	FLOOR_EVENT_DOOR_CLOSE,			//门锁关闭

	FLOOR_EVENT_TEST_MODE_PUSH,			//测试模式按下
	FLOOR_EVENT_TEST_MODE_TAKEOFF,		//测试模式抬起
	
	FLOOR_EVENT_TEST_UP_CLICK,			//测试上单击
	FLOOR_EVENT_TEST_DOWN_CLICK,		//测试下单击
	
	FLOOR_EVENT_TEST_UP_DOUBLE_CLICK,	//测试上双击
	FLOOR_EVENT_TEST_DOWN_DOUBLE_CLICK,	//测试下双击
	
	FLOOR_EVENT_TEST_UP_PUSH,		//测试上按下
	FLOOR_EVENT_TEST_UP_TAKEOFF,	//测试上抬起
	FLOOR_EVENT_TEST_DOWN_PUSH,		//测试下按下
	FLOOR_EVENT_TEST_DOWN_TAKEOFF,	//测试下抬起

}FLOOR_EVENT_E;








typedef enum {
    SYSTEM_CHECK_OK = 0,        //无异常
    SYSTEM_TEST_MODE,           //测试模式
    SYSTEM_EMERGENCY_STOP,      //紧急停止
    SYSTEM_FAULT_BAND_BREAK,    //抱闸异常
    SYSTEM_FAULT_TERM_RELAY,    //热继电器异常
}SYSTEM_CHECK_STATE_E;

typedef enum {
    FLOOR_STATE_INIT = 0,       //初始化状态
    FLOOR_STATE_WAIT_STANDBY,   //等待初始化完成
    FLOOR_STATE_WAIT_READY,     //等待获得当前楼层
    FLOOR_STATE_IDLE,           //等待指令
    FLOOR_STATE_FAULT,          //异常状态
    FLOOR_STATE_RUNNING,        //运行状态
    FLOOR_STATE_TEST,           //测试状态
	FLOOR_STATE_WAIT_TIMEOUT,	//等待倒计时
    FLOOR_STATE_STOP,           //停止状态
}MAIN_MODE_E;

#define JT_KEY_RCU          RCU_GPIOA
#define JT_KEY_BASE         GPIOA
#define JT_KEY_PIN          GPIO_PIN_11

#define DOOR_CHECK_RCU      RCU_GPIOA
#define DOOR_CHECK_BASE     GPIOA
#define DOOR_CHECK_PIN      GPIO_PIN_12

#define FLAT_FLOOR_RCU      RCU_GPIOB
#define FLAT_FLOOR_BASE     GPIOB
#define FLAT_FLOOR_PIN      GPIO_PIN_2

#define UPPER_LIMIT_RCU     RCU_GPIOB
#define UPPER_LIMIT_BASE    GPIOB
#define UPPER_LIMIT_PIN     GPIO_PIN_1

#define LOWER_LIMIT_RCU     RCU_GPIOB
#define LOWER_LIMIT_BASE    GPIOB
#define LOWER_LIMIT_PIN     GPIO_PIN_0

/**
 * @brief 用户设备初始化
 ***/
void user_device_init();

/**
 * @brief 获得门锁状态
 * @return 0: 没锁 1: 已锁
 ***/
uint8_t get_door_lock();

/**
 * @brief 获得平层状态
 * @return 0: 没有 1: 有平层信号
 ***/
uint8_t get_flat_floor();

/**
 * @brief 获得上限位
 * @return 0: 没有 1: 有限位信号
 ***/
uint8_t get_upper_limit();

/**
 * @brief 获得下限位
 * @return 0: 没有 1: 有限位信号
 ***/
uint8_t get_lower_limit();

/**
 * @brief 主线循环
 ***/
int main_loop();

#endif //__GD32E23x_USER_APP_H__
